/* CJLib -- message.c */

#include <stdarg.h>
#include <stdio.h>

/* from osLib */
#include "oslib/messagetrans.h"
#include "oslib/os.h"
#include "oslib/wimp.h"
#include "oslib/wimpreadsysinfo.h"

/* from CJLib */
#include "message.h"


#define MSG_BUF_LEN 256


static char *appname;
static messagetrans_control_block *cb;
static char msg_buf [MSG_BUF_LEN];
static wimp_version_no OS_version;


static os_error errblock;  // static, in case we're out of memory



/**********************************************************************/

static osbool show_msg ( osbool query, char const *buttons )

{
  wimp_error_box_selection click = wimp_ERROR_BOX_SELECTED_NOTHING;
  wimp_error_box_flags flags;


  /* Try to cope with pre and post RISC OS 3.5 */
  if (OS_version < wimp_VERSION_RO35)
  {
    /* pre RISC OS 3.5 - use original wimp error box */
    flags = wimp_ERROR_BOX_OK_ICON | wimp_ERROR_BOX_SHORT_TITLE;

    if (query) flags |= wimp_ERROR_BOX_CANCEL_ICON;

    xwimp_report_error ( &errblock, flags, appname, &click ) ;
  }
  else
  {
    /* 3.5 or above - use new style call */

    /* new (RO3.5) style call with Continue button */
    flags =  wimp_ERROR_BOX_SHORT_TITLE | wimp_ERROR_BOX_GIVEN_CATEGORY;

    if (query)
    {
      flags |= ( wimp_ERROR_BOX_CATEGORY_QUESTION << wimp_ERROR_BOX_CATEGORY_SHIFT );
      if (!buttons)
      {
        flags |= (wimp_ERROR_BOX_OK_ICON | wimp_ERROR_BOX_CANCEL_ICON) ;
      }
    }
    else
    {
      flags |= wimp_ERROR_BOX_OK_ICON
               | ( wimp_ERROR_BOX_CATEGORY_INFO << wimp_ERROR_BOX_CATEGORY_SHIFT );
    }

    xwimp_report_error_by_category ( &errblock,
                                     flags, appname, NULL, NULL, buttons, &click );
    /* if we have changed buttons text, then returned values are 3 and 4 ...
       Convert back to 1 and 2 ... to allow same test for either RISC OS version */
    if (buttons) click -= 2;
  }
  return (click == wimp_ERROR_BOX_SELECTED_OK);
}







char *CJL_MsgLookup (const char *token, char *def_format)

{
  os_error *err;
  char *message;
  int len = 0;
  char *format = NULL;


  err = xmessagetrans_lookup ( cb,
                               token,
                               msg_buf,
                               MSG_BUF_LEN,
                               NULL, NULL, NULL, NULL,
                               (char**)&format,
                               &len ) ;
  if ((err == NULL)  && (len > 0))
  {
    /* Lookup appears ok */
    /* terminate the message */
    msg_buf[len] = '\0';
    message = msg_buf;
  }
  else
  {
    /* lookup failed, so use default */
    message = def_format;
  }
  return message;
}






void CJL_MsgWarnF (char *token, char *def_format, ...)

{
  va_list     args;
  char *message;


  /* Set err code = 0 - non-fatal */
  errblock.errnum = 0;

  message = CJL_MsgLookup ( token, def_format );

  va_start (args, def_format);
  vsprintf ( &errblock.errmess[0], message, args );
  va_end ( args );

  show_msg ( WARNING, NULL );

  return;
}




/* Primarily for temporary reporting of trace data during debug */

void CJL_MsgDBF (char *def_format, ...)

{
  va_list     args;


  /* Set err code = 0 - non-fatal */
  errblock.errnum = 0;

  va_start (args, def_format);
  vsprintf ( &errblock.errmess[0], def_format, args );
  va_end ( args );

  show_msg ( WARNING, NULL );

  return;
}





osbool CJL_MsgQueryF (char *token, char const *buttons, char *def_format, ...)

{
  va_list     args;
  char *message;


  /* Set err code = 0 - non-fatal */
  errblock.errnum = 0;

  message = CJL_MsgLookup ( token, def_format );

  va_start (args, def_format);
  vsprintf ( &errblock.errmess[0], message, args );
  va_end ( args );

  return (show_msg ( QUERY, buttons ));
}





osbool CJL_Message ( osbool query,
                      char *token, char const *buttons, char *def_format)

{
  char *message;


  /* Set err code = 0 - non-fatal */
  errblock.errnum = 0;

  message = CJL_MsgLookup ( token, def_format );

  sprintf ( &errblock.errmess[0], message );


  return ( show_msg ( query, buttons ) );
}




osbool CJL_MessageF ( osbool query,
                      char *token, char const *buttons, char *def_format, ...)

{
  va_list     args;
  char *message;


  /* Set err code = 0 - non-fatal */
  errblock.errnum = 0;

  message = CJL_MsgLookup ( token, def_format );

  va_start (args, def_format);
  vsprintf ( &errblock.errmess[0], message, args );
  va_end ( args );

  return ( show_msg ( query, buttons ) );
}





void CJL_MsgInit ( char *an, messagetrans_control_block *blk )

{
  appname = an;
  cb = blk;
  OS_version = wimpreadsysinfo_version ();
  return;
}




